/*
 * flash.c
 *
 *  Created on: 2020年12月28日
 *      Author: Administrator
 */

#include "common.h"
#include "em_msc.h"
#include "bsp_flash.h"

//读取指定地址的半字(16位数据)
//faddr:读地址(此地址必须为2的倍数!!)
//返回值:对应数据.
uint16_t EFRFLASH_ReadHalfWord(uint32_t faddr)
{
    return *(__IO uint16_t*)faddr;
}
//读取指定地址的字(32位数据)
//faddr:读地址
//返回值:对应数据.
uint32_t EFRFLASH_ReadWord(uint32_t faddr)
{
    return *(__IO uint32_t*)faddr;
}

/****************************************************************
*Name:      ReadFlashNBtye
*Function:  从内部Flash读取N字节数据
*Input:     STARTADDR：数据地址（偏移地址）
*Input:     ReadBuf：数据指针
*Input:     ReadNum：读取字节数
*Output:    读取的字节数
*Author:    gm_jeng
*Date:      2020/3/10
*E-Mail:    gm_jeng@163.com
*Other:
****************************************************************/

int ReadFlashNBtye(uint32_t STARTADDR, uint8_t *ReadBuf, uint32_t ReadNum)
{
    uint32_t DataNum = 0;
    while(DataNum < ReadNum)
    {
        *(ReadBuf + DataNum) = *(__IO uint8_t*) STARTADDR++;
        DataNum++;
    }
    return DataNum;
}



/****************************************************************
*Name:      WriteFlashOneWord
*Function:  向内部Flash写入32位数据
*Input:     WriteAddress：数据地址（偏移地址）WriteData：写入数据
*Output:    NULL
*Author:    ValerianFan
*Date:      2014/04/09
*E-Mail:    fanwenjingnihao@163.com
*Other:
****************************************************************/

void WriteFlashOneWord(uint32_t addr, uint32_t WriteData)
{
    MSC_Init();                                     //解锁

    //MSC_EnableCache(false);                         //FLASH擦除期间,必须禁止数据缓存

    MSC_WriteWord((uint32_t *)addr, &WriteData, 4);         //写一个word数据

    //MSC_EnableCache(true);                          //FLASH擦除结束,开启数据缓存

    MSC_Deinit();                                   //上锁

}

int WriteFlashPrepare(uint32_t addr, uint32_t lens)
{
    uint8_t *value = (uint8_t *)addr;
    for(uint32_t i = 0; i < lens; i++)
    {
        if(0xff != value[i])
        {
            return -1;
        }
    }
    return 0;
}

uint8_t Erase_Parameter_Sector(uint32_t addr)
{
    MSC_Init();                                     //解锁

    //MSC_EnableCache(false);                         //FLASH擦除期间,必须禁止数据缓存

    MSC_ErasePage((uint32_t *)addr);         //写一个word数据

    //MSC_EnableCache(true);                          //FLASH擦除结束,开启数据缓存

    MSC_Deinit();                                   //上锁

    return 0;
}


/**WriteAddr:起始地址(此地址必须为4的倍数!!)
  *pBuffer:数据指针
  *NumToWrite:字(32位)数(就是要写入的32位数据的个数.)
  */
void EFRFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
{
    /* 0 - 128k or userdata*/
    if((WriteAddr < (FLASH_START_ADDR + FLASH_TOTAL_SIZE)) || ((USERDATA_BASE <= WriteAddr) && (WriteAddr < (USERDATA_BASE + 1024))))
    {
        /* do nothing !!*/
    }
    else
    {
        return;//非法地址
    }

    if((WriteAddr % 4))return;//非法地址

    MSC_Init();                                     //解锁

    //MSC_EnableCache(false);                         //FLASH擦除期间,必须禁止数据缓存

    MSC_WriteWord((uint32_t *)WriteAddr, pBuffer, 4 * NumToWrite);

    //MSC_EnableCache(true);                          //FLASH擦除结束,开启数据缓存

    MSC_Deinit();                                   //上锁
}




